% !TeX spellcheck = de_DE
\documentclass[UTF8,a4paper]{book} %设为A4纸
\usepackage{geometry}
\geometry{left=2cm,right=3cm,top=4cm,bottom=3cm} %设置页边距
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{amsmath}
\usepackage{multicol}
\usepackage{verbatim}  %use verbatim
\usepackage{ctex}
\usepackage{ifthen}
\usepackage{makeidx}

\usepackage{xcolor}
\colorlet{lightcyan}{cyan!40!white}

%\usepackage{chngcntr}
\usepackage{stackengine}

\usepackage{tasks}

\newlength{\longestlabel}

\settowidth{\longestlabel}{\bfseries viii.}

\usepackage[lastexercise]{exercise}
%\counterwithin{Exercise}{chapter}
%\counterwithin{Answer}{chapter}

%\renewcounter{Exercise}[chapter]

\setlength{\QuestionIndent}{7em}

\usepackage{enumerate}

\newboolean{printanswer}

%---------------------答案格式开始定义-----------------------------------------
%判断题后面加括号
\newcommand{\pd}[2][1]{\nolinebreak\dotfill\mbox{\raisebox{-1.8pt}
		{$\cdots$}(\makebox[#1 cm][c]{
			\ifthenelse{\boolean{printanswer}}
			{\ifthenelse{\equal{#2}{t}}{\Checkmark}{\XSolid}}
			{}
		})}}


%填空题画线  \tk
%\newcommand{\tk}[2][2.5]{\; \underline{\hspace{#1 cm} \hphantom{#2} \hspace{#1 cm} } \, }
\usepackage{ulem}
\newcommand{\tk}[2][0.5]{\;\uline{ 
		\hspace*{#1 cm}
		\ifthenelse{\boolean{printanswer}}{#2}{\hphantom{#2}}  
		\hspace*{#1 cm}
} }
%简答题  \jd
\newcommand{\jd}[2][4]{\par
	%\begin{minipage}[t][#1cm][t]{0.92\linewidth}	
	\ifthenelse{\boolean{printanswer}}{
		\begin{Answer}
			答：\par
			#2
		\end{Answer}
	}
	{}  
	%\end{minipage} 
}	
%---------------------------答案格式结束定义---------------------------------
\usepackage[breaklinks,colorlinks,linkcolor=black,citecolor=black,urlcolor=black]{hyperref} %生成pdf中的书签
\setboolean{printanswer}{true} %控制是否输出习题的答案

%-----------定义了题的解释文本-------------------
\newenvironment{explain}{\vspace{1cm}\noindent\textbf{\color{blue}%
		\ifdefstring{\ELEGANT@lang}{en}{Explain}{说明}\,
}}{\par}
%----------------------------------------------

\begin{document}
	
%-----------古典密码--------------------	
	\chapter{古典密码}
	\begin{Exercise}
		对一个英文txt文档实现凯撒加密，编译后的可执行程序名为caesarcipher.exe，比如要对1.txt文件进行加密，执行"caesarcipher -e 1.txt 1e.txt",其中-e表示加密，1.txt是要加密的文件，1e.txt是指定的加密后将信息写入的文件。如果要对1e.txt解密，执行"caesarcipher -d 1e.txt 1.txt"，其中-d表示解密，1e.txt是要解密的文件，1.txt是解密后的文件。程序在gitee上有初始仓库，在要求时间前发送pull request。程序编写完后写一个报告，报告内容包括，摘要，目标、设计、测试、总结，此报告上传到gitee上，上传的报告必需是pdf格式！\par
		\vspace{0.5cm}
		项目参考初始仓库\url{https://gitee.com/buuer/caesarcipher.git}\par
		提交截止时间：2020年3月9日8：00前\par
		
	\end{Exercise}

	\begin{explain}
		\begin{itemize}
			\item 首先要考虑一个正常的txt文档中，除了包括字母，还要由标点符号，而算法只能处理字母，所以输入的txt文档要进行预处理，以某种规则去掉不能处理的字符，然后进行加密。
			\item 由于对原始文档进行了预处理，所以解密后的文档与原始文档不是完全一样的。
			\item 提交的文档为PDF格式。
			\item 建议对所有学生的此实验报告进行认真打磨，反复修改，直到符合要求，通过这个过程使得学生掌握此类文档的书写要求，掌握基本科技类文档的写作技能，在此课程的后续文档编写中，学生能够顺利输出合乎规范的文档。
			\item 在gitee上创建项目：caesarcipher，并且将学生做为观察者加入，项目描述为：“对一个纯英文的txt文件，利用凯撒加密方法进行加解密，由于其只能处理字母，所以要对txt文件进行预处理，然后进行加解密，解密后的文件与原始的不同，这是正确的，而且由于预处理时有信息丢失，所以也不可能还原到原始文件。”,学生做为观察者的原因时限制学生权限，以免其误操作修改项目中原始文件，学生完成后，向指导教师发起pull requet，教师可以去其仓库下载其实验内容，实验内容除了代码，可执行程序，还需包含实验报告。
			
		\end{itemize}
	\end{explain}

	\begin{Exercise}
		对一个中文txt文档，利用古典加密的思想，设计一个加密方式对其进行加密，可以参考凯撒加密的方法，编译后的可执行程序名为hancipher.exe，比如要对1.txt文件进行加密，执行"hancipher -e 1.txt 1e.txt",其中-e表示加密，1.txt是要加密的文件，1e.txt是指定的加密后将信息写入的文件。如果要对1e.txt解密，执行"hancipher -d 1e.txt 1.txt"，其中-d表示解密，1e.txt是要解密的文件，1.txt是解密后的文件。程序在gitee上有初始仓库，在要求时间前发送pull request。此练习不需要写报告，但是需要在源代码中有清晰和足够的中文注释。
		\par
		\vspace{0.5cm}
		项目参考初始仓库\url{https://gitee.com/buuer/Hancipher.git}\par
		提交截止时间：2020年3月16日8：00前\par
		
	\end{Exercise}


%-----------流密码--------------------

\chapter{流密码}
	\begin{Exercise}
		编程实现流加密算法，其密钥由32位LFSR生成。算法对一个txt文件进行加密，加密后的信息存在二进制文件中，测试用txt文件内容为"密码学是信息安全专业的一门基础课，北京联合大学开设了信息安全专业，所以北京联合大学开设了密码学课程。"。也可对加密后的二进制文件进行解密，解密后存位一个txt文件，执行命令时，用户可以指定txt文件名，和二进制文件名。seed是存储种子值的二进制文件。\par
		例如:\\
		加密执行的命令: streamcipher -e 1.txt seed c1\\
		解密执行的命令: streamcipher -d c1 seed 2.txt
		\par
		\vspace{0.5cm}
		项目参考初始仓库\url{https://gitee.com/buuer/streamcipher32lfsr.git}\par
		提交截止时间：2020年3月23日8：00前\par
	\end{Exercise}
	\begin{explain}
		\begin{itemize}
			\item 密钥是什么？本原多项是什么(抽头序列是什么？Fibonacci配置是什么？)，可以查阅相关材料。

		\end{itemize}
	\end{explain}

	
%-----------分组密码--------------------
\chapter{分组密码}
	\begin{Exercise}
		编程实现DES加解密算法，工作模式为ECB模式，填充模式，请选择一种填充模式做为加密时的缺省填充模式。编写算法实现说明文档。算法实现后用命令行的方式运行。
		\par
		例如:\\
		加密执行的命令: descipher -e 1.txt key c1\\
		解密执行的命令: descipher -d c1 key 2.txt\\
		其中：key是保存密钥的二进制文件，c1是密文二进制文件，1.txt是原文的txt文件，2.txt是解密后原文文本文件。
		\par
		\vspace{0.5cm}
		项目参考初始仓库\url{https://gitee.com/buuer/DESCipher.git}\par
		提交截止时间：2020年4月6日8：00前\par
	\end{Exercise}

	\begin{Exercise}
		编程实现TDES(Triple DES)加解密算法。
	\end{Exercise}

	
%-----------公钥密码--------------------
\chapter{公钥密码}
	\begin{Exercise}
		用GNU MP库，实现512位RSA加解密算法。
		\par
		例如:\\
		密钥生成：rsacipher -keygen pkey skey \\
		加密执行的命令: rsacipher -e 1.txt pkey c1\\
		解密执行的命令: rsacipher -d c1 skey 2.txt\\
		其中：pkey是保存公钥的文件，skey是保存私钥的文件，c1是密文二进制文件，1.txt是原文的txt文件，2.txt是解密后原文文本文件。
		\par
		\vspace{0.5cm}
		项目参考初始仓库\url{https://gitee.com/buuer/rsacipher.git}\par
		提交截止时间：2020年4月27日8：00前\par
	\end{Exercise}
	
	\begin{explain}
		\begin{itemize}
			\item 既然pkey和skey是命令参数，这就意味这存储公私要的文件名，你是可以自己定义的。
			\item 在公私钥文件中，存的不是一个数，而应该是两个数，所以存储格式你自己要明确，否则，读就是个问题。
			\item n怎么确定？你可以参考\url{https://blog.csdn.net/chengqiuming/article/details/82725708}。
			\item 更完整、安全的方法，可以查阅NIST 的SP 800-56,FIPS 186-4等系列标准。密钥产生是个很重要的问题，所以NIST对其有一系列的标准涉及到。
			\item 在所有密码算法实现中，随机数是一个非常重要的基础部件，GNU MP库提供了大伪随机数产生的算法。
			\item 在实现此算法中，可以直接利用GNU MP库中已有的算法，比如用GCD进行互素判定、mpz\_probab\_prime\_p进行素性判断等。
		\end{itemize}
	\end{explain}
%-----------哈希函数--------------------
\chapter{哈希函数}
	\begin{Exercise}
		编程实现MD5算法，参考RFC1321，生成的hash值用16进制的数的表述方式写道你指定的一个txt文件中。并用一个常用的软件对计算结果对比，以此来说明你算法实现的正确性，可以使用openssl，或者windows中的certutil等等。程序编写完成后，要编写算法实现说明文档，将此文档的pdf格式上传到你的gitee仓库中。
		\par
		例如:\\
		生成摘要：md5hash file1 1.txt \par
		
		其中：file1文件中的内容是要生成摘要的内容，1.txt文件时一个文本文件，file1文件摘要的16进制形式的表述写到这个文件中。
		\par
		\vspace{0.5cm}
		项目参考初始仓库\url{https://gitee.com/buuer/md5hash.git}\par
		提交截止时间：2020年4月27日8：00前\par
		
	\end{Exercise}
%------应用练习
\chapter{利用证书进行安全邮件通信}
	\begin{Exercise}
		利用OpenSSL生成一个1024bit的公钥证书和对应的私钥，并且保存好私钥文件。并且将你的公钥证书上传到老师指定的目录下，公钥证书的命名为：**.cer，**为你的姓名(汉字)。\par
		利用邮件客户端(比如Thunderbird)用老师的公钥加密，发送一个加密的邮件给老师，并且用你的私钥签名。邮件内容是：\\
		我成功了！\\
		***\\
		???\\
		其中：***是你的名字，???是发送日期。
	\end{Exercise}
%-------编程练习评判标准
\chapter{编程类练习参考评分标准}
\section{编程类练习评分标准(有报告)}
\subsection{设计考虑}
通过此类练习希望学生能够通过应用掌握一些工程工具，如此课程中的git和流程图的绘制软件及绘制方法。\par
另外希望学生能够进一步熟练使用C语言进行编程，提高使用C语言的能力。\par
学生能够理解已有的密码算法，并能够用C语言实现。\par
学生能够利用GMP大数据库编写算法，具备初步利用第三方库的能力，同时可以利用他设计并实现一些底层的数学算法。\par
通过编写规范的技术文档，基本掌握此类文档的编制方法。

\subsection{参考评分标准}
每次代码评分总分，如果没有按时提交为0分，没有按时提交，但是有合理理由，并被老师接受，为了体现公平，其评分总分为此次按时交作业中的最低分，最后得分将按其实际总分等比例获得.\par
每次代码评分总分为60分，评分规则为：
\begin{itemize}
	\item CR(code running):代码运行情况，共35分，细则为：
	\begin{itemize}
		\item 无提交0分.
		\item 能按要求正确运行并且在验证执行中没有错误，35——30分；
		\item 能按要求正确运行但在验证执行中有一些错误，不影响获得正确结果，30——25分；
		\item 基本能够按照要求运行，运行中有错误，但可以获得正确的主要结果，25——20分.
		\item 可以运行，无法获得正确结果，20——15分.
		\item 有可执行程序，但无法运行，获得合理解释，15——0分.
	\end{itemize}
	\item DQ(document qualification):文档文字描述，共15分，细则为：
	\begin{itemize}
		\item DQ-1文档中有文字描述.无0分，有5分.
		\item DQ-2文字描述质量.简练清晰5分,把框架或功能准确描述出来3，描述混乱0.
		\item DQ-3有框架或功能流程图.无0分，不满足规范或者不准确3分，满足规范且准确5分。
	\end{itemize}
	\item TC(test cases):测试用例，共10分，细则为：
	\begin{itemize}
		\item TC-1测试用例。无0分，有但是描述不规范3分，有且描述规范5分.
		\item TC-2测试用例设计。覆盖全面功能且考虑全面5分，覆盖全部功能但考虑不全面主要内容3，未覆盖全面功能且考虑欠缺0分。
	\end{itemize}
\end{itemize}

\section{编程类练习评分标准(无报告)}
此类练习只需要提交源代和编译后的代码到gitee上即可。\par
评价依据是，如果没有按时提交为0分，没有按时提交，但是有合理理由，并被老师接受，为了体现公平，其评分总分为此次按时交作业中的最低分，最后得分将按其实际总分等比例获得.\par
代码评分总分为50分，评分规则为：
\begin{itemize}
	\item CR(code running):代码运行情况，共35分，细则为：
	\begin{itemize}
		\item 无提交0分.
		\item 能按要求正确运行并且在验证执行中没有错误，35——30分；
		\item 能按要求正确运行但在验证执行中有一些错误，不影响获得正确结果，30——25分；
		\item 基本能够按照要求运行，运行中有错误，但可以获得正确的主要结果，25——20分.
		\item 可以运行，无法获得正确结果，20——15分.
		\item 有可执行程序，但无法运行，获得合理解释，15——0分.
	\end{itemize}
	\item EN(explanatory note)，共15分，细则为：
	\begin{itemize}
		\item EN-1无注释.无0分，有5分.
		\item EN-2通过注释能很好阅读代码，注释简练清晰全面10-15分；通过注释不能很好阅读代码(比如注释不全面等问题)，5-10分
	\end{itemize}
	
\end{itemize}

\chapter{课程设计}
实现一个TCP/IP通信，应用层加密，密钥使用Diffie-Hellman密钥交换协议进行密钥交换。

\section{参考项目}
推荐两个TCP/IP数据传输的参考项目，一个是但进程的(\url{https://gitee.com/qixi_feng/TCP-demo})，一个多进程的(\url{https://gitee.com/hinzer/socket_tcp_test})。

\end{document}